//-------------------------------------------------------------------------------
//UNIVERSIDAD DEL VALLE DE GUATEMALA
//CC2003- ALGORITMOS Y ESTRUCTURAS DE DATOS
//PROYECTO NO. 3
//MARIA FERNANDA LOPEZ SILIEZAR-10154
//SEBASTIAN RODRIGUES-11
//DIEGO ECHEVERRIA-11
//Jose Guillermos Gonzales
//DESCRIPCION: CLASE PRINCIPAL QUE SIMULA EL REPORTE DE PARADAS ENTRE PAISES            
//--------------------------------------------------------------------------------
import java.io.*;
public class Grafo<E> implements InterfazGrafo<E> {
    
    //ATRIBIBUTOS DE LA CLASE
    private static final int numNodos=22;        //CANTIDAD DE NODOS DEL GRAFO
    private static int nodos[][][];       //NODOS     
    private static String paises[];     //Paises
    
    
    //****************************************************
    //METODO CONSTRUCTOR (PREFEDINIDO):
    //  INICIALIZA EL ESTADO DEL OBJETO
    //****************************************************
    public Grafo(){
        nodos = new int[numNodos][numNodos][2];
        paises = new String[numNodos];
    }
    
    //****************************************************
    //METODO QUE AGREGA UN NODO AL GRAFO
    //****************************************************
    @Override
    public  void addNodo(int nodo, String dato){
        paises[nodo]=dato;
    }
    
    //****************************************************
    //METODO QUE AGREGA UN ARCO AL GRAFO
    //****************************************************
    @Override
    public  void addArco(int c1, int c2, int distancia) {
        nodos[c1][c2][0]=distancia;
        nodos[c2][c1][0]=distancia;
        nodos[c1][c2][1]=c1;
        nodos[c2][c1][1]=c2;
    }
  
    //****************************************************
    //METODO QUE DEVUELVE ESTADO DEl PAIS
    //****************************************************
    public String getPaises(int nodo){
        return paises[nodo];
    }
    
    //****************************************************
    //METODO QUE DEVUELVE EL PESO ENTRE DOS NODOS
    //****************************************************
    public int peso(int cc1, int cc2){
        return nodos[cc1][cc2][0];
    }
    
    //************************************************************
    //METODO QUE DEVUELVE LA PARADA ENTRE DOS PAISES
    //METODO FLOYD WARSHAL OBTENIDO DEL LIBRO JAVA STRUCTURES
    //************************************************************
    public void distanciaPaises(){
        for (int cont1 = 0; cont1 < numNodos; cont1++){
         for (int cont2 = 0; cont2 < numNodos; cont2++){
            for (int cont3 = 0; cont3 < numNodos; cont3++){
                if((nodos[cont1][cont3][0] + nodos[cont3][cont2][0]) <nodos[cont1][cont2][0]){
                        nodos[cont1][cont2][0] = nodos[cont1][cont3][0]+nodos[cont3][cont2][0];
                        nodos[cont1][cont2][1] = cont3;
                }
            }
         }
        }
    }

    //**************************************************************
    //METODO QUE DEVUELVE LA PARADA ENTRE PAISES
    //**************************************************************
    public String distanciaPais(int cc1, int cc2){
        String corto="";
        if (cc1!=cc2){
            corto=  distanciaPais(cc1, nodos[cc1][cc2][1]) + " - " +paises[cc2];
            
        }else{
           corto= paises[cc1];
        }
        return corto;
    }
    
    //****************************************************
    //METODO CARGA LOS DATOS DE LOS PAISES
    //****************************************************
    public  void textoPaises(){
        boolean validar =false;
        String verif2=null;
        FileReader archivo=null;
        try{
           archivo = new FileReader("C:/Users/Mafer/workspace/HOJA9/PAISES");
        }catch (Exception s){
                System.out.println(s.getMessage());
                validar=true;
        }
        
        if(!validar) {
                BufferedReader leera = new BufferedReader(archivo);
                
                for(int i = 0; i < numNodos; i++) {
                    try {
                        verif2 = leera.readLine();
                    } catch (Exception s) {
                        System.out.println("\n NO HAY MAS INFORMACION");
                    }
                    
                    if(verif2 != null) {
                        addNodo(i, verif2);
                    }
                }
                
                System.out.println("\n--> ARCHIVO 1 CARGADO");
        }
    }
    
    //****************************************************
    //METODO CARGA LAS PARADAS ENTRE PAISES
    //****************************************************
    public  void textoArcos(){
        boolean validar =false;
        String verif=null;
        FileReader archivo1=null;
        String dist[] = new String[3];
        
        try{
            archivo1= new FileReader("C:/Users/Mafer/workspace/Proyecto3/PARADAS");
        }catch (Exception s){
                System.out.println(s.getMessage());
                validar=true;
        }
        
         if(!validar) {
            BufferedReader leera = new BufferedReader(archivo1);    
            for(int i = 0; i < numNodos; i++) {
                for (int j=0; j< numNodos;j++){
                    if (i<j){
                        try {
                            verif = leera.readLine();
                            dist=verif.split(" ");

                        } catch (Exception s) {
                            System.out.println("\n NO HAY MAS INFORMACION");
                            verif=null;
                        }

                        if(dist[2] != null) {
                            int weight = 0;
                            weight  = Integer.parseInt(dist[2]);
                            addArco(i, j, weight);
                        }
                    }
                }
            }
         }     
    }
    
    //****************************************************
    //METODO QUE NOTIFICA UNA INTERRUPCION ENTRE PAISES 
    //****************************************************
    public void conexionInterrumpida(String c1, String c2){
        for (int cont1 = 0; cont1 < numNodos; cont1++){
            for (int cont2 = 0; cont2 < numNodos; cont2++){
                if (cont1 != cont2) {
                    if(c1.equalsIgnoreCase(getPaises(cont1)) && c2.equalsIgnoreCase(getPaises(cont2))) {
                    addArco(cont1, cont2, 1000000);
                    System.out.println("\nREPORTE -> INTERRUPCION SOBRE: " + c1 +" HACIA " + c2);
                
                   }
                }
            }
        }
    }
    
    //****************************************************
    //METODO QUE MODIFICA EL ESTADO DE UN ARCO
    //****************************************************
    public void setArco(String c1, String c2, int distancia){
        for (int cont1 = 0; cont1 < numNodos; cont1++){
            for (int cont2 = 0; cont2 < numNodos; cont2++){
                if (cont1 != cont2) {
                    addArco(cont1, cont2, distancia);
                }
            }
        }
    }

    

}

